package pua.uniandes.monitoreo;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Date;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.naming.InitialContext;
import pua.uniandes.interfaz.InterfazCentroMonitoreo;
import pua.uniandes.paqueteAuxiliar.MD5;
//import pua.uniandes.servicios.ReporteMisionesBeanRemote;

/**
 *
 * @author jd.velasquez3209
 */
public class MonitoreoExp2 {

    private ServerSocket server;
    private Socket cliente;
    private BufferedReader in;
    private static final int CANTIDAD_PAQUETE = 20;
    private InterfazCentroMonitoreo icm;
    private ArrayList<double[]> tramasGuardadas;
//    private ReporteMisionesBeanRemote rmbr;
    private Integer numTramas;

    public MonitoreoExp2(InterfazCentroMonitoreo inter)
    {
        icm=inter;
        tramasGuardadas=new ArrayList<double[]>();
        crearConexion();
//        crearMision();
//        iniciarMision();
//        establecerConexion();
//        recepcionTransmisionVideo();
    }

    public void crearConexion(){
         try {
            System.out.println("Va a tratar de crear la trama");
            Properties props = new Properties();
            props.load(new FileInputStream("jndi.properties"));
            InitialContext ctx = new InitialContext(props);
//            rmbr = (ReporteMisionesBeanRemote) ctx.lookup("java:global/Experimento1MonitoreoControl/Experimento1MonitoreoControl-ejb/ReporteMisionesBean!pua.uniandes.servicios.ReporteMisionesBeanRemote");
            System.out.println("La conexión fue exitosa");
        }
         catch (Exception ex){
            Logger.getLogger(Monitoreo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void establecerConexion()
	{
		try {
			server= new ServerSocket(7854);
			cliente=server.accept();
			in = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
			String cadena="";
			for(int j=0;j<numTramas;j++)
                        {
				cadena=in.readLine();
				System.out.println(cadena);
                                byte[] bConv=cadena.getBytes();
                                //COMPRUEBA LA INTEGRIDAD
                                bConv=comprobarIntegridad(bConv);
                                if(bConv!=null){
                                //DESENCRIPTAR
                                    cadena=desEncriptarTrama(bConv);
                                    System.out.println("LALALA CADENA:"+cadena);
                                    String[] datos= cadena.split("@");
                                    Date fecha=new Date((Long.parseLong(datos[6])));
                                    cadena=cadena.replace(datos[6], fecha+"("+datos[6]+")");
                                    icm.actualizar(cadena);
                                    System.out.println("TiempoActual"+System.currentTimeMillis());
                                    double[] result=new double[datos.length];
                                    for (int i = 0; i < datos.length; i++) {
                                        result[i]=Double.parseDouble(datos[i]);
                                        System.out.println("result"+i+":"+result[i]);
                                    }
                                    tramasGuardadas.add(result);
                                }
			}
                        icm.pintarGrafica(tramasGuardadas);
                        System.out.println("TiempoFinal"+System.currentTimeMillis());
                        System.out.println("Salió del ciclo");
                        System.out.println("Tamaño tramasGuardadas:"+tramasGuardadas.size());
                         for (int i = 0; i < tramasGuardadas.size(); i++) {
//                             HiloGuardarTramas hilo=new HiloGuardarTramas(tramasGuardadas.get(i), rmbr);
//                             hilo.start();

//                    System.out.println("Guardó la trama efectivamente");
//                        }

		}} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

    public boolean crearMision(String nombre, String cohete)
    {
        try {
//            rmbr.crearMision(nombre, cohete, new Date(System.currentTimeMillis()));
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }
    }

    public void setNumTramas(int i){
        numTramas=i;
    }

    public boolean iniciarMision(String name)
    {
        try {
//           return rmbr.iniciarMision(name);
        } catch (Exception ex) {
            Logger.getLogger(Monitoreo.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }


    public void guardarTrama(double aceX,double aceY,double aceZ,double alt,double pote,double temp,Date tiemp){
        try {
            System.out.println("Va a tratar de crear la trama");
            Properties props = new Properties();
            props.load(new FileInputStream("jndi.properties"));
            InitialContext ctx = new InitialContext(props);
//            ReporteMisionesBeanRemote rmbr = (ReporteMisionesBeanRemote) ctx.lookup("java:global/Experimento1MonitoreoControl/Experimento1MonitoreoControl-ejb/ReporteMisionesBean!pua.uniandes.servicios.ReporteMisionesBeanRemote");

//            rmbr.guardarTrama(aceX, aceY, aceZ, alt, pote, temp, tiemp);
            System.out.println("si pudo guardarla");
        } catch (Exception ex) {
            Logger.getLogger(Monitoreo.class.getName()).log(Level.SEVERE, null, ex);
        } 
    }

    private String desEncriptarTrama(byte[] bConv) {
        String resultado="";
        try {
            Cipher cifra= Cipher.getInstance("Blowfish");
            cifra.init(Cipher.DECRYPT_MODE, obtenerLlave());
            byte[] bDecifrado=cifra.doFinal(bConv);
            resultado=new String(bDecifrado);
        } catch (Exception e) {
        }
        return resultado;
    }

    private SecretKey obtenerLlave(){
        SecretKey key=null;
        byte[] llave={-13, -67, 87, 62, 90, -43, -120};
        key= new SecretKeySpec(llave, "Blowfish");
        return key;
    }

    private byte[] comprobarIntegridad(byte[] cadenaInicial){
        String s=new String(cadenaInicial);
        String cadenaCifrada=s.split("RAFAELC")[0];
        String integridad=s.split("RAFAELC")[1];
         try {
            MD5 ejemplo = new MD5();
            ejemplo.Update(cadenaCifrada, null);
            String has2 = ejemplo.asHex();
            if(has2.equalsIgnoreCase(integridad)){
                System.out.println("LALA:" + s );
                return cadenaCifrada.getBytes();
            }
            else return null;
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(MonitoreoExp2.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

}

